home *** CD-ROM | disk | FTP | other *** search
-
- PROGRAM EPM( INPUT, OUTPUT, INFILE, DATAIO );
- (*===========================================================================*)
- (* This program converts 99000, 7000, and 320 load modules into binary *)
- (* format and writes the binary values to the DATA I/O device. The user is *)
- (* prompted for the following information: *)
- (* 1. Load Bias - the offset to be applied when converting relocatable *)
- (* addresses to absolute addresses (in Hex.) *)
- (* 2. 4-bits or 8-bits - the user specifies if the chip being programmed *)
- (* is a 4-bit or 8-bit chip. *)
- (* 3. Is the load module a 320 module - the 320 is word oriented and *)
- (* the offsets need to be converted internally from words to bytes. *)
- (* 4. Number of bytes/nibbles to send - the number of 8 or 4 bit values *)
- (* to be sent to the DATA I/O device (in Hex.) *)
- (* 5. Inline or Parallel - Inline loads the bytes sequentially while *)
- (* Parallel loads every other byte into the DATA I/O. *)
- (* 5a. Msb or Lsb - applies only if Parallel is chosen. Msb will load the *)
- (* most significant byte of each 16-bit word, Lsb will load the least *)
- (* significant byte of each word. *)
- (* 6. Starting Address - the absolute address from which loading of the *)
- (* module into the DATA I/O is to begin (in Hex.) *)
- (* 7. Continue (Y/N) - prompts if the user has more to download. *)
- (* 8. Need to load next phase - if the user has linked the object using *)
- (* overlays to specify pages, this will load the next phase into *)
- (* memory for the program to process. *)
- (* Note: The program assumes that the DATA I/O is configured in the system *)
- (* similar to a terminal, but the device may be allocated to lock *)
- (* out other users. The allocation is done in the command procedure *)
- (*===========================================================================*)
-
- (*===========================================================================*)
- (* Modifications made to the program in migration to the Vax: [TWG feb. 83] *)
- (* 1. The ability to handle 7000 and 320 modules was added. *)
- (* 2. Compressed object can be handled as well as ASCII object. *)
- (* 3. Load modules with multiple phases are handled. *)
- (* 4. 4-bit and 8-bit downloading is handled in a single program. *)
- (* 5. The actual downloading to the DATA I/O is Vax specific. *)
- (*===========================================================================*)
-
- CONST
- HEXF = 15;
- HEXFF = 255;
- HEX7FFF = 32767;
- HEXFFFE = 65534;
- HEXFFFF = 65535;
- HEX10000 = 65536;
- MEM_LENGTH = 131071; (* 64K WORDS NEEDED FOR 320 *)
- MESS0 = '**Error - Offset > Task Length ';
- MESS1 = '**Error - Offset Must be Even ';
- MESS2 = '**Error - Bad Input Data, Operation Aborted ';
- MESS3 = '**Warning - Premature EOF Reached ';
- MESS4 = '**Error - Operation Aborted by User ';
- MESS5 = '**Error - Bad Tag, , Operation Aborted, Tag = ';
- MESS6 = 'Hit <CR> to continue when DATA I/O is ready ';
- MESS7 = '**Error - Bad Data in File, Operation Aborted ';
- MESS8 = '**Error - Checksum Error - Program Aborted ';
- MESS9 = '**Error - DATA I/O Link in use - Program Aborted ';
- MESSA = '**Error - Load Module Unavailable - Program ';
-
- TYPE
- BYTE = 0 .. HEXFF;
- LONGINT = INTEGER;
- ADDRESS = 0 .. 65535;
- EMPTYPE = RECORD (* USE TO KEEP (NESTED) SOURCE SO THE ORDER *)
- END; (* OF WORD'S FIELDS IS EASILY REVERSED *)
- WORD = PACKED RECORD
- CASE INTEGER OF
- 0: ( I: ADDRESS );
- 1: ( START1: EMPTYPE;
- BIT: 0 .. 1;
- WDS: 0 .. HEX7FFF;
- END1: EMPTYPE );
- 2: ( START2: EMPTYPE;
- LOBYTE: 0 .. HEXFF;
- HIBYTE: 0 .. HEXFF;
- END2: EMPTYPE );
-
- 3: ( START3: EMPTYPE;
- LOCHAR: CHAR;
- HICHAR: CHAR;
- END3: EMPTYPE );
- 4: ( START4: EMPTYPE;
- LOBYTELONIBBLE: 0 .. HEXF;
- LOBYTEHINIBBLE: 0 .. HEXF;
- HIBYTELONIBBLE: 0 .. HEXF;
- HIBYTEHINIBBLE: 0 .. HEXF;
- END4: EMPTYPE );
- 5: ( START5: EMPTYPE;
- S: PACKED SET OF 0 .. 15;
- END5: EMPTYPE );
- 6: ( START6: EMPTYPE;
- T: PACKED ARRAY[ 0 .. 15 ] OF BOOLEAN;
- END6: EMPTYPE );
- END;
- STR4 = PACKED ARRAY[ 1 .. 4 ] OF CHAR;
- STR8 = PACKED ARRAY[ 1 .. 8 ] OF CHAR;
- PATHNAME = PACKED ARRAY[ 1 .. 40 ] OF CHAR;
-
-
- VAR
- INFILE: TEXT;
- DATAIO: FILE OF BYTE;
- MEM_ARRAY: PACKED ARRAY[ 0 .. MEM_LENGTH ] OF BYTE;
- EVEN_BYTE, ODD_BYTE: BYTE;
- NO_BYTES, OFFSET, XFER, MAX_LENGTH, BIAS: LONGINT;
- PC: LONGINT;
- LOAD_ADDR, ENTRY_POINT: LONGINT;
- J: INTEGER;
- BUFFER: INTEGER;
- HEXIN: STR4;
- CHKSUM: WORD;
- COMPRESSED: BOOLEAN;
- IS_320: BOOLEAN;
- FOUR_BITS: BOOLEAN;
- CONTINUE: BOOLEAN;
- NEED_PHASE: BOOLEAN;
- STAT: INTEGER;
- IORP, MORL: CHAR;
- REPLY: CHAR;
- CH: CHAR;
-
- PROCEDURE CHECKSUM( SUM: WORD ); FORWARD;
- PROCEDURE DISCONNECT; FORWARD;
- PROCEDURE HEXDEC( HXINPUT: STR4; VAR HXOUTPUT: LONGINT ); FORWARD;
- PROCEDURE INITDATAIO; FORWARD;
- PROCEDURE INITIALIZE; FORWARD;
- PROCEDURE LENGTH( BYTE_NO: LONGINT ); FORWARD;
- PROCEDURE LOAD; FORWARD;
- PROCEDURE READSCREEN; FORWARD;
- PROCEDURE SENDBLOCK; FORWARD;
- PROCEDURE WRDIO( BITS: BYTE ); FORWARD;
- PROCEDURE EXIST( P: PATHNAME; LENGTH: INTEGER; VAR STATUS: INTEGER );
- EXTERN;
-
- PROCEDURE CHECKSUM(* ( SUM : WORD ) *);
-
- (*===========================================================================*)
- (* Checksum writes to nil bytes to the DATA I/O followed by the Sum Check. *)
- (* The sum check is also written to the output file along with the number of *)
- (* bytes transferred in decimal. *)
- (*===========================================================================*)
-
- VAR
- A: ARRAY[ 1 .. 4 ] OF INTEGER;
- C: INTEGER;
-
- BEGIN
- WRDIO( 0 );
- WRDIO( 0 );
- WRDIO( SUM.HIBYTE );
- WRDIO( SUM.LOBYTE );
- FOR C := 4 DOWNTO 1 DO
- BEGIN
- A[ C ] := SUM.I MOD 16;
- SUM.I := SUM.I DIV 16;
- END;
- FOR C := 1 TO 4 DO
- BEGIN
- IF A[ C ] < 10 THEN
- HEXIN[ C ] := CHR( A[ C ] + 48 )
- ELSE
- HEXIN[ C ] := CHR( A[ C ] + 55 );
- END;
- WRITELN( OUTPUT, 'Checksum = ', HEXIN );
- WRITELN( OUTPUT, 'Bytes Transferred = ', XFER: 5 );
- END;
-
- PROCEDURE DISCONNECT;
-
- (*===========================================================================*)
- (* Disconnect simply prints a message that the program is terminating and *)
- (* calls HALT if the termination is not normal. *)
- (*===========================================================================*)
-
- BEGIN
- WRITELN( OUTPUT, 'DATA I/O Download Link is Disconnected' );
- WRITELN( OUTPUT, '***********Execution Ends***********' );
- IF CONTINUE THEN (* PREMATURE TERMINATION *)
- HALT;
- END;
-
- PROCEDURE HEXDEC(* ( HXINPUT: STR4;
- VAR HXOUTPUT: LONGINT ) *);
-
- (*===========================================================================*)
- (* HexDec converts a four character string representing a hex number into *)
- (* an integer value. *)
- (*===========================================================================*)
-
- CONST
- HEX10 = 16;
-
- VAR
- K: INTEGER;
- LENGTH: INTEGER;
- NB: ARRAY[ 1 .. 4 ] OF INTEGER;
-
- BEGIN
- LENGTH := 4;
- FOR K := 1 TO 4 DO
- CASE HXINPUT[ K ] OF
- '0': NB[ K ] := 0;
- '1': NB[ K ] := 1;
- '2': NB[ K ] := 2;
- '3': NB[ K ] := 3;
- '4': NB[ K ] := 4;
- '5': NB[ K ] := 5;
- '6': NB[ K ] := 6;
- '7': NB[ K ] := 7;
- '8': NB[ K ] := 8;
- '9': NB[ K ] := 9;
- 'A', 'a': NB[ K ] := 10;
- 'B', 'b': NB[ K ] := 11;
- 'C', 'c': NB[ K ] := 12;
- 'D', 'd': NB[ K ] := 13;
- 'E', 'e': NB[ K ] := 14;
- 'F', 'f': NB[ K ] := 15;
- ' ': LENGTH := LENGTH - 1; (* Ignore Trailing Blanks *)
- OTHERWISE
- BEGIN
- WRITELN( OUTPUT, MESS2 );
- DISCONNECT;
- END;
- END; {CASE}
- HXOUTPUT := 0;
- FOR K := 1 TO LENGTH DO
- HXOUTPUT := HXOUTPUT * HEX10 + NB[ K ];
- END;
-
- PROCEDURE INITDATAIO;
-
- (*===========================================================================*)
- (* InitDATAIO checks if the DATA I/O device is ready by calling the assembly *)
- (* language routine EXIST. If the device is accessible, then a Pascal OPEN *)
- (* is executed with the file name DATAIO being associated with the Vax *)
- (* logical name DIO0:. The command procedure assigns DIO0 to be the output *)
- (* device. Initial information needed by the DATA I/O as specified in the *)
- (* manuals is also written. *)
- (*===========================================================================*)
-
- CONST
- PROM_DEV = 'DIO0: ';
- NAME_LEN = 5;
-
- VAR
- STATUS: INTEGER;
-
- BEGIN
- EXIST( PROM_DEV, NAME_LEN, STATUS );
- IF STATUS = 0 THEN
- BEGIN
- OPEN( DATAIO, PROM_DEV, OLD );
- REWRITE( DATAIO );
- END
- ELSE
- BEGIN
- WRITELN( OUTPUT, MESS9 );
- HALT;
- END;
- WRDIO( 8 );
- WRDIO( 28 );
- WRDIO( 42 );
- WRDIO( 73 );
- WRDIO( 8 );
- WRDIO( 0 );
- END;
-
- PROCEDURE INITIALIZE;
-
- (*===========================================================================*)
- (* Initialize prompts for needed information and assign the values needed to *)
- (* load the first phase into memory. *)
- (*===========================================================================*)
-
- CONST
- FILENAME = 'INFILE ';
- NAME_LEN = 6;
-
- VAR
- CH: CHAR;
- OVAL: BOOLEAN;
- TRMNL: BYTE;
- K: INTEGER;
- STATUS: INTEGER;
-
- BEGIN
- WRITELN( OUTPUT, 'DATA I/O System 19 Prom Programmer Utility' );
- CONTINUE := TRUE;
- EXIST( FILENAME, NAME_LEN, STATUS );
- IF STATUS = 0 THEN
- BEGIN
- OPEN( INFILE, FILENAME, OLD );
- RESET( INFILE );
- END
- ELSE
- BEGIN
- WRITELN( OUTPUT, MESSA );
- DISCONNECT;
- END;
- WRITELN( OUTPUT, 'Load Bias in Hex:' );
- RESET( INPUT );
- READ( INPUT, HEXIN );
- HEXDEC( HEXIN, BIAS );
- WRITELN( OUTPUT, '(4)-bits or (8)-bits at a time ? : ' );
- READLN( INPUT );
- READ( INPUT, CH );
- FOUR_BITS := ( CH = '4' );
- WRITELN( OUTPUT, 'Is the Load Module a 320 Module ( Y/N ) ? : ' );
- READLN;
- READ( INPUT, CH );
- IS_320 := ( CH = 'Y' ) OR ( CH = 'y' );
- FOR K := 0 TO MEM_LENGTH DO
- MEM_ARRAY[ K ] := HEXFF; (* INITIALIZE MEMORY *)
- NEED_PHASE := TRUE;
- END;
-
- PROCEDURE LENGTH(* ( BYTE_NO: LONGINT ) *);
-
- (*===========================================================================*)
- (* Length writes the number of bytes to be transferred to the DATA I/O as *)
- (* 4-bit (nibble) values as specified in the DATA I/O manuals. *)
- (*===========================================================================*)
-
- VAR
- SEND: WORD;
-
- BEGIN
- SEND.I := BYTE_NO; (* SEND FOUR NIBBLE BYTE COUNT *)
- WRDIO( SEND.HIBYTEHINIBBLE );
- WRDIO( SEND.HIBYTELONIBBLE );
- WRDIO( SEND.LOBYTEHINIBBLE );
- WRDIO( SEND.LOBYTELONIBBLE );
- WRDIO( 255 );
- END;
-
- PROCEDURE LOAD;
-
- (*===========================================================================*)
- (* Load reads records from the object module and processes the tags and data *)
- (* to convert the load module to a binary representation in memory. A whole *)
- (* phase is ready into memory at one time and several operations may be done *)
- (* on the phase before a new one is read. *)
- (* Note: special care of addresses must be taken for 320 modules. *)
- (*===========================================================================*)
-
- VAR
- OBJ_REC: PACKED ARRAY [ 1 .. 80 ] OF CHAR;
- K: INTEGER;
- IDX: INTEGER;
- NAME: STR8;
- TAG: CHAR;
- VAL: WORD;
-
- PROCEDURE GETINT( VAR VAL: WORD; TAG: CHAR ); FORWARD;
-
- PROCEDURE GETINT(* ( VAR VAL: WORD; TAG: CHAR ) *);
-
- (*===========================================================================*)
- (* Getint obtains a 16-bit unsigned integer from the object record. *)
- (*===========================================================================*)
-
- VAR
- TMPINT: ARRAY[ 0 .. 3 ] OF INTEGER;
- CH: CHAR;
- K: INTEGER;
- CH_COUNT: INTEGER;
-
- BEGIN (* GETINT *)
- VAL.I := 0;
- IF COMPRESSED THEN
- BEGIN (* GET THE VALUE INTO VAL *)
- VAL.HICHAR := OBJ_REC[ IDX ];
- IDX := IDX + 1;
- IF TAG <> '*' THEN
- BEGIN
- VAL.LOCHAR := OBJ_REC[ IDX ];
- IDX := IDX + 1;
- END;
- END
- ELSE
- BEGIN
- IF TAG = '*' THEN
- CH_COUNT := 1
- ELSE
- CH_COUNT := 3;
- FOR K := 0 TO CH_COUNT DO
- BEGIN
- CH := OBJ_REC[ IDX ];
- IDX := IDX + 1;
- IF TAG <> '7' THEN
- CHKSUM.I := CHKSUM.I - ORD( CH );
- CASE CH OF
- '0': TMPINT[ K ] := 0;
- '1': TMPINT[ K ] := 1;
- '2': TMPINT[ K ] := 2;
- '3': TMPINT[ K ] := 3;
- '4': TMPINT[ K ] := 4;
- '5': TMPINT[ K ] := 5;
- '6': TMPINT[ K ] := 6;
- '7': TMPINT[ K ] := 7;
- '8': TMPINT[ K ] := 8;
- '9': TMPINT[ K ] := 9;
- 'A': TMPINT[ K ] := 10;
- 'B': TMPINT[ K ] := 11;
- 'C': TMPINT[ K ] := 12;
- 'D': TMPINT[ K ] := 13;
- 'E': TMPINT[ K ] := 14;
- 'F': TMPINT[ K ] := 15;
- OTHERWISE
- BEGIN
- WRITELN( OUTPUT, MESS7 );
- DISCONNECT;
- END;
- END;
- END;
- VAL.HIBYTEHINIBBLE := TMPINT[ 0 ];
- VAL.HIBYTELONIBBLE := TMPINT[ 1 ];
- VAL.LOBYTEHINIBBLE := TMPINT[ 2 ];
- VAL.LOBYTELONIBBLE := TMPINT[ 3 ];
- END;
- END; (* GETINT *)
-
- BEGIN (* LOAD *)
- COMPRESSED := FALSE;
- CHKSUM.I := 0;
- WRITELN( OUTPUT, ' **Loading of Object Module Begins**' );
- READ( INFILE, OBJ_REC );
- IDX := 1;
- REPEAT
- TAG := OBJ_REC[ IDX ];
- IDX := IDX + 1;
- IF TAG = CHR( 01 ) THEN
- BEGIN
- COMPRESSED := TRUE;
- TAG := '0';
- END;
- IF ( TAG <> 'F' ) AND ( TAG <> ':' ) THEN
- BEGIN
- IF NOT COMPRESSED THEN
- CHKSUM.I := CHKSUM.I - ORD( TAG );
- GETINT( VAL, TAG );
- END;
- CASE TAG OF
- '0', 'K', 'I':
- BEGIN
- IF NOT COMPRESSED THEN
- FOR K := 0 TO 7 DO
- CHKSUM.I := CHKSUM.I - ORD( OBJ_REC[ IDX + K ] );
- IDX := IDX + 8;
- END;
- '1', '2':
- BEGIN
- ENTRY_POINT := VAL.I;
- IF TAG = '2' THEN
- ENTRY_POINT := ENTRY_POINT + BIAS;
- PC := ENTRY_POINT;
- IF IS_320 THEN
- PC := PC * 2;
- END;
- '3','4', '5', '6', 'G', 'H':
- BEGIN
- IF NOT COMPRESSED THEN
- FOR K := 0 TO 5 DO
- CHKSUM.I := CHKSUM.I - ORD( OBJ_REC[ IDX + K ] );
- IDX := IDX + 6;
- END;
- '7':
- BEGIN
- IF CHKSUM.I <> VAL.I THEN
- BEGIN
- WRITE( OUTPUT, MESS8 );
- WRITELN( ' ': 5, VAL.I: 6, CHKSUM.I: 6 );
- DISCONNECT;
- END;
- CHKSUM.I := 0;
- END;
- '8':
- CHKSUM.I := 0;
- '9', 'A':
- BEGIN
- LOAD_ADDR := VAL.I;
- IF TAG = 'A' THEN
- LOAD_ADDR := LOAD_ADDR + BIAS;
- PC := LOAD_ADDR;
- IF IS_320 THEN
- PC := PC * 2; (* CONVERT WORD DISP TO BYTE DISP *)
- END;
- 'B', 'C':
- BEGIN
- IF TAG = 'C' THEN
- VAL.I := VAL.I + BIAS;
- MEM_ARRAY[ PC ] := VAL.HIBYTE;
- PC := PC + 1;
- MEM_ARRAY[ PC ] := VAL.LOBYTE;
- PC := PC + 1;
- IF PC - 1 > MAX_LENGTH THEN
- MAX_LENGTH := PC - 1;
- END;
- '*':
- BEGIN
- MEM_ARRAY[ PC ] := VAL.HIBYTE;
- PC := PC + 1;
- IF PC - 1 > MAX_LENGTH THEN
- MAX_LENGTH := PC - 1;
- END;
- 'D':
- BEGIN
- BIAS := VAL.I;
- IF IS_320 THEN
- BIAS := BIAS * 2;
- IF BIAS MOD 2 <> 0 THEN
- BIAS := BIAS + 1;
- END;
- 'F':
- BEGIN
- READ( INFILE, OBJ_REC );
- IDX := 1;
- END;
- ':': ;
- OTHERWISE
- BEGIN
- WRITE( OUTPUT, MESS5 );
- WRITELN( ' ': 5, TAG );
- DISCONNECT;
- END;
- END;
- UNTIL TAG = ':';
- END; (* LOAD *)
-
- PROCEDURE READSCREEN;
-
- (*===========================================================================*)
- (* ReadScreen obtains values needed to download the binary object in memory *)
- (* into the DATA I/O. *)
- (*===========================================================================*)
-
- VAR
- K: INTEGER;
- ERR: BOOLEAN;
-
- BEGIN (* READSCREEN *)
- REPEAT
- WRITELN( OUTPUT, 'Number of Bytes/Nibbles to Send (Hex) : ' );
- READLN;
- READ( INPUT, HEXIN );
- HEXDEC( HEXIN, NO_BYTES );
- UNTIL NO_BYTES > 0;
- WRITELN( OUTPUT, '(I)nline or (P)arallel ? : ' );
- READLN;
- READ( INPUT, IORP );
- IF IORP = 'i' THEN
- IORP := 'I';
- IF IORP = 'p' THEN
- IORP := 'P';
- IF IORP = 'P' THEN
- BEGIN
- WRITELN( OUTPUT, '(M)sb or (L)sb ? : ' );
- READLN;
- READ( INPUT, MORL );
- IF MORL = 'm' THEN
- MORL := 'M';
- IF MORL = 'l' THEN
- MORL := 'L';
- END;
- REPEAT
- ERR := FALSE;
- WRITELN( OUTPUT, 'Starting Address (Hex) : ' );
- READLN;
- READ( INPUT, HEXIN );
- HEXDEC( HEXIN, OFFSET );
- IF ( OFFSET MOD 2 = 1 ) and not IS_320 THEN
- BEGIN
- ERR := TRUE;
- WRITELN( OUTPUT, MESS1 );
- END;
- UNTIL ERR = FALSE;
- END; (* READSCREEN *)
-
- PROCEDURE SENDBLOCK;
-
- (*===========================================================================*)
- (* SendBlock ships the number of bytes specified by the user to the DATA I/O *)
- (* device. If the object module is exhausted before the number of bytes is *)
- (* reached, then a warning message is printed and values of HEXFF are sent *)
- (* for the remaining bytes. *)
- (*===========================================================================*)
-
- VAR
- TMPWRD: WORD;
- K: INTEGER;
-
- BEGIN (* SENDBLOCK *)
- CHKSUM.I := 0;
- XFER := 0;
- IF IS_320 THEN
- J := OFFSET * 2 (* Convert word to byte address *)
- ELSE
- J := OFFSET;
- WHILE ( ( XFER < NO_BYTES ) AND ( J <= MAX_LENGTH ) ) DO
- BEGIN
- IF IORP = 'I' THEN
- BEGIN
- TMPWRD.HIBYTE := MEM_ARRAY[ J ];
- IF FOUR_BITS THEN
- BEGIN
- WRDIO( TMPWRD.HIBYTEHINIBBLE );
- WRDIO( TMPWRD.HIBYTELONIBBLE );
- END
- ELSE
- WRDIO( TMPWRD.HIBYTE );
- CHKSUM.I := CHKSUM.I + TMPWRD.HIBYTE;
- J := J + 1;
- TMPWRD.LOBYTE := MEM_ARRAY[ J ];
- IF FOUR_BITS THEN
- BEGIN
- WRDIO( TMPWRD.LOBYTEHINIBBLE );
- WRDIO( TMPWRD.LOBYTELONIBBLE );
- END
- ELSE
- WRDIO( TMPWRD.LOBYTE );
- CHKSUM.I := CHKSUM.I + TMPWRD.LOBYTE;
- IF FOUR_BITS THEN
- XFER := XFER + 4
- ELSE
- XFER := XFER + 2;
- J := J + 1;
- END
- ELSE
- IF MORL = 'M' THEN
- BEGIN
- TMPWRD.HIBYTE := MEM_ARRAY[ J ];
- IF FOUR_BITS THEN
- BEGIN
- WRDIO( TMPWRD.HIBYTEHINIBBLE );
- WRDIO( TMPWRD.HIBYTELONIBBLE );
- END
- ELSE
- WRDIO( TMPWRD.HIBYTE );
- CHKSUM.I := CHKSUM.I + TMPWRD.HIBYTE;
- IF FOUR_BITS THEN
- XFER := XFER + 2
- ELSE
- XFER := XFER + 1;
- J := J + 2;
- END
- ELSE
- IF MORL = 'L' THEN
- BEGIN
- IF J MOD 2 = 0 THEN
- J := J + 1;
- TMPWRD.LOBYTE := MEM_ARRAY[ J ];
- IF FOUR_BITS THEN
- BEGIN
- WRDIO( TMPWRD.LOBYTEHINIBBLE );
- WRDIO( TMPWRD.LOBYTELONIBBLE );
- END
- ELSE
- WRDIO( TMPWRD.LOBYTE );
- CHKSUM.I := CHKSUM.I + TMPWRD.LOBYTE;
- IF FOUR_BITS THEN
- XFER := XFER + 2
- ELSE
- XFER := XFER + 1;
- J := J + 2;
- END;
- END;
- IF J > MAX_LENGTH + 1 THEN
- BEGIN
- WRITELN( OUTPUT, XFER, NO_BYTES );
- XFER := XFER + 1;
- FOR K := XFER TO NO_BYTES DO
- BEGIN
- WRDIO( 0 );
- { CHKSUM.I := CHKSUM.I + 255; }
- END;
- J := -1;
- CHECKSUM( CHKSUM );
- WRITELN( OUTPUT, MESS3 );
- END
- ELSE
- BEGIN
- J := -1;
- CHECKSUM( CHKSUM );
- END;
- END; (* SENDBLOCK *)
-
- PROCEDURE WRDIO(* ( BITS: BYTE ) *);
-
- (*===========================================================================*)
- (* Wrdio writes an 8-bit value to the DATA I/O device as a byte. *)
- (*===========================================================================*)
-
- BEGIN (* WRDIO *)
- WRITE( DATAIO, BITS );
- END; (* WRDIO *)
-
- BEGIN (* EPM *)
- INITIALIZE;
- REPEAT
- IF NEED_PHASE THEN
- LOAD;
- READSCREEN;
- WRITELN( OUTPUT, ' Enter the following on the DATA I/O: ' );
- WRITELN( OUTPUT, ' ' );
- WRITELN( OUTPUT, ' SEL, 1, 0, ENTER, SEL, D, 1, START ' );
- WRITELN( OUTPUT, ' ' );
- WRITELN( OUTPUT, MESS6 );
- READLN( CH ); (* Wait for the user's response *)
- J := -1;
- INITDATAIO;
- J := -1;
- LENGTH( NO_BYTES );
- IF OFFSET > MAX_LENGTH THEN
- BEGIN
- WRITELN( OUTPUT, MESS0 );
- CONTINUE := TRUE;
- END
- ELSE
- BEGIN
- SENDBLOCK;
- CLOSE( DATAIO );
- WRITELN( OUTPUT, 'Continue (Y/N) ? : ' );
- READ( INPUT, REPLY );
- CONTINUE := ( REPLY = 'Y' ) OR ( REPLY = 'y' );
- END;
- IF CONTINUE THEN
- BEGIN
- WRITELN( OUTPUT, 'Need to load next phase ? : ' );
- READLN( INPUT );
- READ( INPUT, REPLY );
- NEED_PHASE := ( REPLY = 'Y' ) OR ( REPLY = 'y' );
- END;
- UNTIL NOT CONTINUE;
- DISCONNECT;
- END. (* EPM *)